#include "Log.hpp"
#include <memory>
#include "ThreadPool.hpp"
#include "Task.hpp"

using namespace LogMoudle;
using namespace ThraedPoolMoudule;

int main()
{
    // std::unique_ptr<LogStrategy> strategy = std::make_unique<ConsoleLogStrategy>(); // C++14 智能指针，拥有其所指向对象的独占所有权。
    // std::unique_ptr<LogStrategy> strategy = std::make_unique<FileLogStrategy>(); // C++14 智能指针，拥有其所指向对象的独占所有权。
    // strategy->SyncLog("Hello log!");

    /////////////////////////////////////////////////////////////////////////////////////////////////

    // logger.EnableFileLogStrategy();
    // logger(LogLevel::DEBUG, "main.cc", 10) << "hello world!" << 3.14;
    // logger(LogLevel::DEBUG, "main.cc", 10) << "hello world!";
    // logger(LogLevel::DEBUG, "main.cc", 10) << "hello world!";
    // logger(LogLevel::DEBUG, "main.cc", 10) << "hello world!";
    // logger(LogLevel::DEBUG, "main.cc", 10) << "hello world!";

    /////////////////////////////////////////////////////////////////////////////////////////////////

    // Enable_Console_Log_Strategy();
    // LOG(LogLevel::DEBUG) << "hello world! " << 3.14;
    // // 编译器看到的:
    // // logger(LogLevel::DEBUG, "Main.cc", 25) << "hello world!";
    // LOG(LogLevel::DEBUG) << "hello world! " << 3.14;
    // LOG(LogLevel::DEBUG) << "hello world! " << 3.14;
    // Enable_File_LogStrategy();
    // LOG(LogLevel::DEBUG) << "hello world! " << 3.14;
    // LOG(LogLevel::DEBUG) << "hello world! " << 3.14;

    /////////////////////////////////////////////////////////////////////////////////////////////////

    // Enable_Console_Log_Strategy();
    // ThreadPool<task_t> *tp = new ThreadPool<task_t>();

    // tp->Start();
    // int count = 10;
    // while (count--)
    // {
    //     tp->Enqueue(Download);
    //     sleep(1);
    // }

    // tp->Stop();

    // tp->Join();
    /////////////////////////////////////////////////////////////////////////////////////////////////

    // 单例模式
    Enable_Console_Log_Strategy();

    int count = 10;
    while (count--)
    {
        sleep(1);
        ThreadPool<task_t>::GetInstance()->Enqueue(Download);
    }
    ThreadPool<task_t>::GetInstance()->Stop();
    ThreadPool<task_t>::GetInstance()->Join();

    return 0;
}
